package com.tedu.review.day02;

/**
 * 抽象类的特点：<补充>
 *            抽象类+类：成员变量+构造器+成员方法
 *            成员变量：既可以是变量，也可以是常量
 *            构造方法：有
 *                     用于子类访问父类的数据【父类默认初始化】
 *            成员方法：既可以是抽象，也可以是非抽象
 *
 * 抽象类中方法的特性：
 * A：抽象方法-----目的：强制子类做的事情【子类一定重写】
 * B：非抽象方法-----目的：子类继承的事情，提高代码复用性【与普通父类一样】
 */
abstract class  Foo{
  //成员变量
    public int i=10;
    //成员变量修饰加上final 也可以叫常量【识别常量：标识符全大写】
    public final int j=20; //Java强类型语言：标识符大小写分明
  // public  int j=30;

  public Foo(){//创建对象同时一并创建：初始化：传输成员变量数据
    this(30);
    //this()调用本类其他构造器，调用有参数--当前属性/成员变量重新赋值
  }

  public Foo(int i) {
    this.i = i;
  }
  //成员方法：抽象【重写】、非抽象【提高复用-继承父亲】
  public abstract void show();
  public void method(){
    System.out.println("Foo----method");
  }
}
//无法实例化【无法直接创建对象】---继承---多态性---利用造型
//Goo 子类【实现类】继承 抽象类  子类必须重写抽象类中所有抽象方法
class Goo extends Foo{
  public void show() {  //抽象类 抽象方法 show()---一定重写
    System.out.println("show Goo");
  }
  public void method(){
    System.out.println("Goo method");
  }

}
public class 抽象类特点1 {
  public static void main(String[] args) {
    //创建对象---实例化
    Foo f=new Goo();
    //①实例化--初始化Goo()构造器，类默认存在空构造器
    //②空构造器默认存在：super()  调用父类的无参构造器
    //③父类的无参构造器中存在;this() 调用本类有参构造器
    //④this(参数)给Foo抽象类的i值进行覆盖 i=30
    System.out.println(f.i);//⑤引用调取i值 打印30
    //调取抽象类常量，不可以给常量赋值
    System.out.println(f.i);
    //--------------------------------------------------
    f.show();//抽象方法     一定被子类重写 Goo   show
    f.method();//非抽象方法    选择实现重写  Foo  show
  }
}
